Spring直接提供了很多Resource
的实现:
UrlResource
封装了一个java.net.URL
,可用于访问任何通常可通过URL访问的对象,如文件,HTTP目标,FTP目标等。所有URL都有一个标准化的字符串表示形式,用适当的标准化前缀来区分另一个URL类型。这包括,file:
用来访问文件系统,http:
用来通过http访问资源。ftp:
用来通过ftp访问资源等。
UrlResource
可以在Java代码里用UrlResource
构造函数显式创建,但是你调用一个接受String参数的API方法时,通常会隐式地创建UrlResource
来表示路径。对于后者,一个JavaBean的PropertyEditor
将最终决定去创建那种Resource
。如果路径字符串包含一些众所周知的前缀,比如classpath:
,它将为该前缀创建适当的专用资源。 但是,如果它不能识别前缀,它会认为这是一个标准的URL字符串,并会创建一个UrlResource
。
这个代表了一个可以从类路径中加载的资源,它使用线程上下文加载器,指定的类加载器或者是指定类的加载器来加载资源。
如果类路径资源在文件系统,那么ClasspathResource
支持将资源解析成java.io.File
。但对于不在文件系统中且未被(任何servel引擎或是任何环境)解压到文件系统下的类路径的资源则不行。为了解决这个问题,各种Resource
实现总是支持解析为java.net.URL
。
ClassPathResource
由Java代码使用ClassPathResource
构造函数显式创建,但是当您调用一个带有表示路径的String参数的API方法时,通常会隐式地创建ClassPathResource
。 对于后一种情况,JavaBeans PropertyEditor将识别字符串路径上的特殊前缀classpath:
并创建一个ClassPathResource
。
该实现是为了支持java.io.File
的句柄。 它支持讲资源解析为一个文件,或是作为一个URL。
该实现是针对ServletContext的资源,用来解析相对路径在web应用程序的位置。
它支持流访问和URL访问,但只有在Web应用程序压缩文件被解压并且该资源物理上存在于文件系统上时才允许被解析java.io.File
。 实际上不管它是否被扩展或是存在文件系统上,还是直接从JAR或其他地方访问比如从DB(可以想象),都依赖于Servlet容器。
该实现针对给定的InputStream
。只有在没有其他适用的资源实现的情况下才使用。在可能的情况下,首选ByteArrayResource
或任何基于文件的资源的特殊的实现。
与其他资源实现相比,这是已打开资源的描述符,因此从isOpen()
返回true
。 如果您需要将资源描述符保存在某处,或者需要多次读取流,请不要使用它。
该资源实现针对字节数组。 它为给定的字节数组创建一个ByteArrayInputStream。
从任意给定的字节数组读取资源的时候,这很有,而不再需要借助只能使用一次的InputStreamResource
。